from flask import Blueprint,request,make_response,jsonify
from flask_restful import Resource,Api
from utils.captcha.captcha import captcha
from utils.Myredis import r
import json
from utils.comm import send_message
import random
from application.models.users.user import *
from db import db
import time
from utils.Myjwt import myjwt
login_blue=Blueprint("login",__name__)
api=Api(login_blue)
# 获取图片验证码
@login_blue.route("/getimg")
def getimg():
# class GetImageCode(Resource):
#     def get(self):
        # 调用captcha生成图片验证码
        name,text,img=captcha.generate_captcha()
        # 存入redis字符串 key:uuid value:text
        uuid=request.args.get("uuid")
        # 存入redis
        r.str_setex(uuid,text,300)
        res=make_response(img)
        # 以流的方式生成图片验证码
        res.headers["Content-Type"]="image/jpg"
        return res
# api.add_resource(GetImageCode,"/getimg")

# 发送短信验证码
@login_blue.route("/sms",methods=["POST"])
def sms():
        # 获取参数
        data=json.loads(request.data)
        mobile=data["mobile"]
        uuid=data["uuid"]
        imagecode=data["imagecode"]
        if not all([mobile,uuid,imagecode]):
            return jsonify({"code":401,"msg":"参数不完整"})
        # 验证图片验证码
        code=r.get_str(uuid)
        # 通过uuid从redis取出来和传递过来的参数进行对比，全部转为小写
        if code:
            if imagecode.lower()!=code.lower():
                # 验证一分钟之内只能发送一次
                mcode=r.get_str(mobile)
                if mcode:
                    return jsonify({"code":403,"msg":"一分钟只能发送一次"})
                # 生成随机数
                scode=random.randint(1000,9999)
                print(scode)
                # 调用短信平台
                flag=send_message(mobile,scode)
                if flag==True:
                    # 存入redis
                    r.add_str(mobile,scode)
                    # r.add_str(mobile,scode,60)
                    # 清除redis中的图片验证码
                    r.del_key(uuid)
                    # 返回结果
                    return jsonify({"code": 200, "msg": "发送成功"})
                else:
                    return jsonify({"code": 403, "msg": "发送验证码失败"})
            else:
                return jsonify({"code":402,"msg":"图片验证码不正确"})
            # 失败返回错误信息
        else:
            return jsonify({"code":403,"msg":"验证码不存在"})

# 登陆
@login_blue.route("/login",methods=["POST"])
def login():
    # 获取参数
    data=request.data
    if data:
        data=json.loads(request.data)
        mcode=data["mcode"]
        mobile=data["mobile"]
        # 根据手机号去redis获取验证码
        code=r.get_str(mobile)
        print("rrrrrrr",code)
        if code:
            # 验证码是否相同
            if int(code)==int(mcode):
                # 如果相同查询数据库user表，存在返回信息
                user=User.query.filter(User.mobile==mobile).first()
                if user:
                    # 删除redis中的验证码
                    r.del_key(mobile)
                # 不存在写入用户表
                else:
                    u=User(mobile=mobile)
                    db.session.add(u)
                    db.session.commit()
                    user=User.query.filter(User.mobile==mobile).first()
                    # 用户信息生成jwt token
                token=myjwt.jwt_encode(data={"data":{"uid":user.id,"exp":int(time.time())}})
                return jsonify({"code":200,"token":token,"userid":user.id,"msg":"登陆成功"})
            else:
                return jsonify({"code":201,"msg":"验证码错误"})
        else:
            return jsonify({"code":200,"msg":"验证码过期"})